package com.spring.trade.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;


import com.spring.trade.dto.PatientTradeOrderDto;
import com.spring.trade.dto.TradeInComeDto;
import com.spring.trade.dto.TradeOrderDto;
import com.spring.trade.dto.TradeOrderInfoDto;
import com.spring.trade.dto.TradeServiceDto;
import com.spring.trade.po.TradeOrderInfo;
/*import com.spring.trade.vo.TradeOrderInfoVo;*/
import com.spring.trade.vo.TradeOrderInfoVo;

public interface ITradeOrderInfoService {
	
		
	/**
	 * 医生已入账收入列表
	 * @param docId
	 * @return
	 */
	public List<TradeInComeDto> getIncomeList(Long docId);
	/**
	 * 查询我的服务
	 * @param patientId
	 * @param serviceType
	 * @return
	 */
	public List<TradeServiceDto> getServiceDtoList(Long patientId,String serviceType,Integer record);
	
	/**
	 * 根据患者ID查询购买的服务
	 * @param patiendId
	 * @return
	 */
	public List<TradeOrderDto> getOrderList(Long patiendId);

	/**
	 * 根据订单号查询
	 * @param orderNo
	 * @return
	 */
	public TradeOrderInfoDto getOrderInfo(String orderNo);

	/**
	 * 根据订单号查询
	 *
	 * @param orderNo
	 * @return TradeOrderInfo
	 */
	public TradeOrderInfo selectByorderNo(String orderNo);

	/**
	 * 更新订单
	 * @param tradeOrderInfo
	 */
	public int updateByPrimaryKeySelective(TradeOrderInfo tradeOrderInfo);

	/**
	 * 根据订单号和规则代码查询
	 * @param orderNo
	 * @param ruleCode
	 * @return
	 */
	public TradeOrderInfoDto getOrderInfoAndRule(String orderNo,String ruleCode);



	/**
	 * 更新信息发送条数
	 *
	 * @param orderNo
	 * @return
	 */
	public int updateSendNumByOrderNo(String orderNo);


	/**
	 * 查询并关闭过期订单
	 */
	public void procExpiredOrders();

	/**
	 * 获取过期订单 1、超过24小时的 2、发送消息数量10条无医生回复的
	 *
	 * @param minute
	 * @param recordNum
	 * @return
	 */
	public List<TradeOrderInfoDto> getExpireOrderAndNoReplyList();

	
	
	/**
	 * 将下单时间超过24小时(后台设置的时间),并且医生发言数超过1条的订单数据,将订单状态改为已完成
	 * @return
	 */
	public List<TradeOrderInfoDto> getCompleteOrderList();
	

	/**
	 * 修改订单状态与医生的总金额
	 */
	public void updateOrderStatus() throws Exception;

	/**
	 * 修改到期订单状态(下单超过)
	 *
	 * @throws Exception
	 */
	public void updateExpiredOrderStatusAndEndTime() throws Exception;

	/**
	 * 修改完成订单状态(订单完成,医生已经接单,并且下单时间超过24小时,将状态改成已完成)
	 * @throws Exception
	 */
	public void updateCompleteOrderStatusAndEndTime() throws Exception;

	/***
	 * 创建订单(有支付)
	 * @param orderInfo
	 * @return
	 * @throws Exception
	 */
	Object createDocSerOrder(TradeOrderInfo orderInfo,HttpServletRequest request)throws Exception;

	/**
	 * 创建订单(免费)
	 */
	void insert(TradeOrderInfo orderInfo);

	/**
	 * 后台查询订单列表
	 * @param tradeOrderInfoVo
	 * @return
	 */
	public List<TradeOrderInfoDto> getTradeOrderInfoList(TradeOrderInfoVo tradeOrderInfoVo);


	/***
	 *
	 * @param doctorId 医生ID
	 * @param serviceId 服务ID
     * @return
     */
	int getBuyNumberByDocIdAndSerId(Long doctorId, Integer serviceId);

	/***
	 * 患者购买之后，再次进入医生详情页的时候，要查询该用户是否购买过和购买的订单号
	 * @param serviceId
	 * @param doctorId
     * @return
     */
	TradeOrderInfo getPatientIsBuyTheDocSer(Integer serviceId, String doctorId,Long patientId);
	
	/**
	 * 根据医生ID和患者ID查询已支付已接单订单
	 * @param doctorId
	 * @param patientId
	 * @return
	 */
	TradeOrderInfoDto getOrderInfoByPidAndDid(Long doctorId,Long patientId);
	/**
	 * 根据医生ID和患者ID查询已支付已接单订单
	 * @param doctorId
	 * @param patientId
	 * @return
	 */
	TradeOrderInfoDto getOrderInfoByDIdAndPIdAndSerId(Long doctorId,Long patientId,Integer serviceType);
	
	/**
	 *  查询最新的十条订单
	 * @return
	 */
	public List<TradeOrderInfoDto> getOrderFormChartList();
	/**
	 *  查询每周的订单
	 * @return
	 */
	public List<TradeOrderInfo> findOrderFormChartWeeksData();
	/**
	 *  查询每月的订单
	 * @return
	 */
	public List<TradeOrderInfoDto> findOrderFormChartMonthsList();

	/***
	 * 患者端我的订单接口
	 * @param orderType
	 * @param patientId
     * @return
     */
    List<PatientTradeOrderDto> findTradeOrderInfoByPatientId(String orderType, Long patientId);

	/***
	 * 版本2.71下单接口
	 * @param orderInfo
	 * @param request
	 * @return
	 * @throws Exception
     */
	Object createTradeOrder(TradeOrderInfo orderInfo, HttpServletRequest request)throws Exception;

	/***
	 * 获得支付宝签名并得到支付内容
	 * @param request
	 * @param orderInfo
     * @return
     */
	Map<String, Object> getAliPaySinInfo(HttpServletRequest request,TradeOrderInfo orderInfo)throws Exception;

	/***
	 * 获得微信支付签名并得到支付内容
	 * @param request
	 * @param orderInfo
	 * @return
	 * @throws Exception
     */
	Map<String,Object> getWxPaySinInfo(HttpServletRequest request,TradeOrderInfo orderInfo)throws Exception;
	
	/***
	 * 一网通支付接口
	 * @param request
	 * @param orderInfo
	 * @return
	 * @throws Exception
     */
	Map<String,Object> getCmbPaySinInfo(HttpServletRequest request,TradeOrderInfo orderInfo)throws Exception;

	/****
	 * 查询患者是否有未支付订单
	 * @param patientId
	 * @param doctorId
     * @return
     */
	TradeOrderInfo getPatientNoPayOrder(Long patientId,Long doctorId,Integer serviceType);

	/***
	 * 查询图文咨询未支付的订单
	 * @param patientId
	 * @param doctorId
     * @return
     */
	boolean getPatientNoPayOrderByServiId(Long doctorId, Long patientId, Integer serviceType);

	/****
	 * 订单付款接口
	 * @param orderNo 订单号
	 * @return
     */
	Map<String,Object> procTradeOrderPayment(String orderNo,HttpServletRequest request,String payType)throws Exception;

    void deleteOrder(String orderNo)throws Exception;

    void procCancelOrder(String orderNo,String cancelMark)throws Exception;

	List<TradeOrderInfo> getPatientNoPayOrderList(Long patientId);
	

	/**
	 * 下单时间超过2小时,机构未确认,自动变待退款，0元变已退款
	 * @throws Exception
	 */
	void updateInstitutionOrdersUnDetermined() throws Exception;
	

	/**
	 * 得到超过2小时,机构未确认的订单
	 * @return
	 */
	List<TradeOrderInfo> getInstitutionOrdersRefundList();

	/**
	 * 机构订单入账(预订时间超过当前时间一小时)
	 * @throws Exception
	 */
	void updateInstitutionOrderStatus() throws Exception;

	/**
	 * 得到所有机构完成的订单
	 * @throws Exception
	 */
	List<TradeOrderInfoDto> getInstitutionOrdersBookedList() throws Exception;
	/**
	 * 根据订单号查询订单详情
	 * @param orderNo
	 * @return
	 */
	PatientTradeOrderDto findTradeOrderInfoDetail(String orderNo,Integer serviceId)throws Exception;


	/***
	 * 根据服务ID查询是否有有效订单
	 * @param doctorId
	 * @param patientId
	 * @param serviceType
     * @return
     */
	boolean getPatientValidOrderByServiId(Long doctorId, Long patientId, Integer serviceType);



	/***
	 * 查询医生是否有未处理的订单
	 * @param doctorId
	 * @return
     */
	boolean findUntreatedOrderOrderByDocId(Long doctorId);
	
	
	/**
	 * 查询付费订单总数
	 * @return
	 */
	int getPayOrderCount();
	
	/**
	 * 查询订单总数(orderMoney不为空时,查询付费订单数)
	 * @return
	 */
	int getPayOrderNumber(Map<String,String> map);
	
	
	/**
	 * 查询活跃医生
	 * @return
	 */
	int getActiveDoctorNumber(String date);
	
	
	
	/**
	 *  查询付费活跃医生 
	 * @return
	 */
	int getPayActiveDoctorNumber(String date);
	
	
	
	/**
	 *查询免费活跃医生
	 * @return
	 */
	int getFreeActiveDoctorNumber(String date);
	
	/**
	 * 查询交易金额 
	 * @return
	 */
	BigDecimal getOrderMoneyByPayTime(String date);
	
	/**
	 * 查询图文未支付订单
	 * @param patient
	 * @param doctorId
	 * @param serviceType
	 * @return
	 */
	TradeOrderInfo selectUnPayText(Long patientId,Long doctorId);
	
	/**
	 * 医生收入明细
	 * @param docId
	 * @param serviceType
	 * @return
	 */
	public List<TradeInComeDto> getIncomeDetailList(Long docId,Integer serviceType);
	
	/**
	 * 查询收入总额
	 * @param docId
	 * @return
	 */
	public List<TradeInComeDto> getIncomeDetailTotal(Long docId);
	
	
}
